package com.engine.salary.service;

import com.engine.salary.entity.salaryitem.config.SalaryItemAllConfig;
import com.engine.salary.entity.salaryitem.config.SalaryItemExcelConfig;
import com.engine.salary.entity.salaryitem.param.*;
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
import com.engine.salary.enums.SalarySystemTypeEnum;
import com.engine.salary.service.impl.SalaryItemServiceImpl;
import com.engine.salary.sys.entity.vo.UploadConfigResponse;
import com.engine.salary.util.excel.ImportExcelResponse;
import com.engine.salary.util.page.PageInfo;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 薪资项目
 * <p>Copyright: Copyright (c) 2022</p>
 * <p>Company: 泛微软件</p>
 *
 * @author qiantao
 * @version 1.0
 **/
public interface SalaryItemService {

    /**
     * 根据主键id获取薪资项目
     *
     * @param id 主键id
     * @return
     */
    SalaryItemPO getById(Long id);

    /**
     * 查询所有薪资项目
     *
     * @return
     */
    List<SalaryItemPO> listAll();

    /**
     * 根据主键id获取薪资项目
     *
     * @param ids 主键id
     * @return
     */
    List<SalaryItemPO> listByIds(Collection<Long> ids);

    /**
     * 根据系统薪资项目的id查询薪资项目
     *
     * @param sysSalaryItemIds 关联的系统薪资项目id
     * @return
     */
    List<SalaryItemPO> listBySysSalaryItemIds(Collection<Long> sysSalaryItemIds);

    /**
     * 根据名称精确匹配获取薪资项目
     *
     * @param name 薪资项目名称
     * @return
     */
    List<SalaryItemPO> listByName(String name);
    SalaryItemPO getByName(String name);


    /**
     * 根据（自定义薪资项目/系统薪资项目）查询薪资项目
     *
     * @param systemType 自定义薪资项目/系统薪资项目
     * @return
     */
    List<SalaryItemPO> listBySystemType(SalarySystemTypeEnum systemType);

    /**
     * 根据（自定义薪资项目/系统薪资项目）、是否默认使用 查询薪资项目
     *
     * @param systemType 自定义薪资项目/系统薪资项目
     * @param useDefault 是否默认使用
     * @return
     */
    List<SalaryItemPO> listBySystemTypeAndUseDefault(SalarySystemTypeEnum systemType, Integer useDefault);

    /**
     * 根据查询参数获取薪资项目（分页）
     *
     * @param searchParam 查询参数
     * @return
     */
    List<SalaryItemPO> listByParam(SalaryItemSearchParam searchParam);

    List<SalaryItemPO> listByParamOrderById(SalaryItemSearchParam searchParam);

    PageInfo<SalaryItemPO> listPageByParam(SalaryItemSearchParam searchParam);


    boolean filterInRange(Set<Long> userTaxAgentIds, SalaryItemPO po);

    /**
     * 保存
     *
     * @param saveParam 保存参数
     */
    SalaryItemPO save(SalaryItemSaveParam saveParam);

    /**
     * 批量保存
     *
     * @param salaryItemPOS 薪资项目
     */
    void batchSave(Collection<SalaryItemPO> salaryItemPOS);

    /**
     * 更新
     *
     * @param saveParam 更新参数
     */
    SalaryItemPO update(SalaryItemSaveParam saveParam);

    /**
     * 根据主键id删除薪资项目
     *
     * @param ids 主键id
     */
    void deleteByIds(Collection<Long> ids);

    /**
     * 获取使用中的项目情况
     *
     * @return
     */
    SalaryItemServiceImpl.UsingItem getUsingItem();

    /**
     * 批量保存薪资项目顺序
     * @param values
     */
    void batchUpdateSortedIndex(List<SalaryItemPO> values);

    /**
     * 获取薪资项目在哪些账套中使用
     * @param salaryItemId
     * @return
     */
    List<Map<String, Object>> getSalarySobBySalaryItem(Long salaryItemId);

    /**
     * 将薪资项目管理中的信息同步至账套
     * @param syncSalaryItemParam
     */
    void syncSalaryItemToSalarySobItem(SyncSalaryItemParam syncSalaryItemParam);

    SalaryItemAllConfig getConfig();

    UploadConfigResponse.Result parseConfig(SalaryItemAllConfig salaryItemConfig);

    SalaryItemPO getItem(SalaryItemPO salaryItemPO);

    List<SalaryItemExcelConfig> getConfig(SalaryItemExportParam param);


    Map<String, Object> preview(SalaryItemImportParam param);

    ImportExcelResponse importSalaryItem(SalaryItemImportParam param);

    XSSFWorkbook export(SalaryItemExportParam param);

    XSSFWorkbook downloadTemplate(SalaryItemDownloadTemplateParam param);

}
